//
// Created by Administrator on 2023/11/20.
//
#include "iostream"
#include "algorithm"

using namespace std;

const int N = 1e5 + 10;

struct Range {
    int l, r;

    bool operator<(const Range &W) const {
        return l < W.l;
    }
} range[N];

int main() {
    int a, b;
    cin >> a >> b;
    int n;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> range[i].l >> range[i].r;
    }
    sort(range, range + n);
    int res=0;
    bool f= false;
    //遍历所有区间
    for (int i = 0; i < n; ++i) {

        //j记录从第几个区间开始
        int j=i,r=-2e9;//r是从第i个区间开始，之后所有端点最右
        while(j<n&&range[j].l<=a){
            r=max(r,range[i].r);
            j++;
        }
        //没有区间的右端点大于线段左端点，直接结束
        if(r<a){
            res=-1;
            break;
        }

        res++;

        //如果存在一个区间横跨线段 则结束
        if(r>=b){
            f= true;
            break;
        }

        //不存在，缩小线段逐步求解，将线段左端点移动到所有满足条件区间的最右端
        a=r;
        //j多加了一次，其代表的是所有区间中左端点最靠近线段左端点的区间,这是为了减少遍历次数的！
        i=j-1;
    }

}